package redlib.backend.service.impl;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import redlib.backend.dao.ContactMapper;
import redlib.backend.dto.ShowProvinceDTO;
import redlib.backend.dto.ContactDTO;
import redlib.backend.dto.query.ContactQueryDTO;
import redlib.backend.model.Admin;
import redlib.backend.model.Contact;
import redlib.backend.model.Page;
import redlib.backend.model.Token;
import redlib.backend.service.AdminService;
import redlib.backend.service.ContactService;
import redlib.backend.service.utils.ContactUtils;
import redlib.backend.utils.FormatUtils;
import redlib.backend.utils.PageUtils;
import redlib.backend.utils.ThreadContextHolder;
import redlib.backend.vo.ShowPronvinceVO;
import redlib.backend.vo.ContactVO;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class ContactServiceImpl implements ContactService {
    @Autowired
    private ContactMapper contactMapper;
    @Autowired
    private AdminService adminService;
    @Override
    public Page<ContactVO> listByPage(ContactQueryDTO queryDTO) {
        if (queryDTO == null) {
            queryDTO = new ContactQueryDTO();
        }
        //模糊查询
        queryDTO.setName(FormatUtils.makeFuzzySearchTerm(queryDTO.getName()));
        queryDTO.setDepartment(FormatUtils.makeFuzzySearchTerm(queryDTO.getDepartment()));
        queryDTO.setTelephoneNumber(FormatUtils.makeFuzzySearchTerm(queryDTO.getTelephoneNumber()));
        queryDTO.setProvince(FormatUtils.makeFuzzySearchTerm(queryDTO.getProvince()));
        queryDTO.setEmail(FormatUtils.makeFuzzySearchTerm(queryDTO.getEmail()));
        queryDTO.setAddress(FormatUtils.makeFuzzySearchTerm(queryDTO.getAddress()));
        Integer size = contactMapper.count(queryDTO);
        PageUtils pageUtils = new PageUtils(queryDTO.getCurrent(), queryDTO.getPageSize(), size);

        if (size == 0) {
            // 没有命中，则返回空数据。
            return pageUtils.getNullPage();
        }

        // 利用myBatis到数据库中查询数据，以分页的方式
        List<Contact> list = contactMapper.list(queryDTO, pageUtils.getOffset(), pageUtils.getLimit());

        // 提取list列表中的创建人字段，到一个Set集合中去
        Set<Integer> adminIds = list.stream().map(Contact::getCreatedBy).collect(Collectors.toSet());

        // 提取list列表中的更新人字段，追加到集合中去
        adminIds.addAll(list.stream().map(Contact::getCreatedBy).collect(Collectors.toSet()));

        // 获取id到人名的映射
        Map<Integer, String> nameMap = adminService.getNameMap(adminIds);

        List<ContactVO> voList = new ArrayList<>();
        for (Contact contact : list) {
            // Department对象(数据库中)转VO对象
            ContactVO vo = ContactUtils.convertToVO(contact, nameMap);
            voList.add(vo);
        }

        return new Page<>(pageUtils.getCurrent(), pageUtils.getPageSize(), pageUtils.getTotal(), voList);
    }
    @Override
    public Integer insert(ContactDTO contactDTO) {
        Token token = ThreadContextHolder.getToken();

        Contact contact1= contactMapper.getByName(contactDTO.getName());
        Assert.notNull(contactDTO, "输入数据不能为空");
        Assert.hasText(contactDTO.getName(), "名称不能为空");
        Assert.isNull(contact1, "联系人已经存在！");
        Assert.isTrue(contactDTO.getTelephoneNumber().length() == 11,"手机号位数不正确");
        Contact contact = new Contact();
        //实体对象，用以保存到数据库
        BeanUtils.copyProperties(contactDTO, contact);
        //将testDTO的属性赋值到test
        contact.setCreatedAt(new Date());
        contact.setUpdatedAt(new Date());
        contact.setCreatedBy(token.getUserId());
        contact.setUpdatedBy(token.getUserId());
        contactMapper.insert(contact);
        return contact.getId();
    }

    @Override
    public void deleteByCodes(List<Integer> ids) {
        Assert.notEmpty(ids,"联系人id列表不能为空");
        contactMapper.deleteByCodes(ids);
    }

    @Override
    public Integer updateRecord(ContactDTO contactDTO) {
        Token token = ThreadContextHolder.getToken();
        Assert.notNull(contactDTO.getId(), "联系人id不能为空");
        Contact contact = contactMapper.selectByPrimaryKey(contactDTO.getId());
        Assert.notNull(contact, "没有找到联系人，id为：" + contactDTO.getId());
        ContactUtils.validateTest(contactDTO);
        BeanUtils.copyProperties(contactDTO, contact);
        contact.setUpdatedBy(token.getUserId());
        contact.setUpdatedAt(new Date());
        contactMapper.updateByPrimaryKey(contact);
        return contact.getId();
    }

    @Override
    public List<ShowPronvinceVO> showProvince() {
        Token token = ThreadContextHolder.getToken();
        List<ShowProvinceDTO> list = contactMapper.showProvince();//调用Mapper中showProvince方法，拿到数据库中的统计数据
        List<ShowPronvinceVO> voList = new ArrayList<>();//定义VO对象数组
        for (ShowProvinceDTO showProvinceDTO : list) {
            ShowPronvinceVO vo = new ShowPronvinceVO();
            BeanUtils.copyProperties(showProvinceDTO,vo);//遍历从数据库中拿到的DTO对象列表，将DTO对象相应属性赋值给VO对象
            voList.add(vo);
        }
    return voList;//voList为传递给前端的数据
    }

    @Override
    public Page<ShowPronvinceVO> page() {
        PageUtils pageUtils = new PageUtils(1,1,0);
        return pageUtils.getNullPage();
    }

}
